1. Introducción

En este seminario analizamos cómo factores estructurales y tecnológicos impactan en la salud mental en España.

Pregunta de investigación: ¿Actúa la tecnología como un escudo protector ante la depresión o, por el contrario, profundiza las desigualdades existentes?

Para responderla, nos centramos en tres dimensiones clave:

  1. Contexto de Salud Mental: Identificar los grupos de riesgo.
  2. Contexto Tecnológico: Mapear la brecha digital por edad y territorio.
  3. Interacción: Cruzar las variables de Empleo, Educación y Territorio.

Utilizamos datos masivos procesados con R, provenientes de dos fuentes oficiales: * Encuesta Europea de Salud. * Encuesta sobre Equipamiento y Uso de Tecnologías (TIC) del INE.


El análisis revela que grupos vulnerables, como los Desempleados, presentan patrones paradójicos de uso tecnológico que discutiremos a continuación.

2. Contexto de Salud Mental

Analizamos la prevalencia de depresión utilizando los gráficos generados en tus scripts de procesamiento de CSV y JSON.

Depresión por Actividad Económica y Sexo

Visualizamos el impacto del desempleo diferenciando entre “Cuadro depresivo mayor” y otros cuadros.

# Código extraído de: Tablas_graficos_CSV.R

# AJUSTE: fig.height=6 para que no sea demasiado alto. layout="l-body-outset" da más ancho.

# Preparación
datos_grafico_actividad <- mis_datos_salud_mental$depresion_actividad_economica %>%
  rename(Porcentaje = Total) %>% 
  mutate(Porcentaje = as.numeric(sub(",", ".", Porcentaje, fixed = TRUE))) %>%
  filter(
    Sexo != "Ambos sexos",
    `Actividad.económica` != "TOTAL",        
    `Prevalencia.depresión` %in% c("Cuadro depresivo mayor", "Otros cuadros depresivos")
  )

# Gráfico
g_actividad_apilado <- ggplot(datos_grafico_actividad,
                              aes(x = reorder(`Actividad.económica`, Porcentaje), 
                                  y = Porcentaje, 
                                  fill = `Prevalencia.depresión`)) +
  geom_col() + 
  facet_wrap(~ Sexo) + 
  coord_flip() + 
  labs(
    title = "Depresión por Actividad Económica y Sexo",
    subtitle = "Prevalencia de cuadros depresivos según situación laboral",
    x = "",
    y = "Porcentaje Total (%)",
    fill = "Diagnóstico"
  ) +
  scale_fill_brewer(palette = "Reds") +
  theme_minimal() +
  theme(legend.position = "bottom",
        plot.title = element_text(face="bold"))

print(g_actividad_apilado)

Intensidad de la Depresión por Edad

Analizamos la gravedad de los síntomas a lo largo del ciclo vital.

# Código extraído de: Tablas_graficos_CSV.R

# AJUSTE: fig.height=5. Más compacto.

datos_grafico_edad <- mis_datos_salud_mental$depresion_sexo_y_grupo_de_edad %>%
  rename(Porcentaje = Total) %>% 
  mutate(Porcentaje = as.numeric(sub(",", ".", Porcentaje, fixed = TRUE))) %>%
  filter(
    Sexo != "Ambos sexos",
    Edad != "TOTAL", 
    `Intensidad.depresión` %in% c("Leve", "Moderada", "Moderadamente grave", "Grave")
  )

g_edad_apilado <- ggplot(datos_grafico_edad,
                         aes(x = Edad, 
                             y = Porcentaje, 
                             fill = `Intensidad.depresión`)) +
  geom_col() + 
  facet_wrap(~ Sexo) + 
  labs(
    title = "Intensidad de Depresión por Edad y Sexo",
    x = "Grupo de Edad",
    y = "Porcentaje (%)",
    fill = "Intensidad"
  ) +
  scale_fill_brewer(palette = "Reds") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) 

print(g_edad_apilado)

3. Contexto de Uso de TICs

A continuación, establecemos el perfil tecnológico de España, observando la brecha generacional en las distintas Comunidades Autónomas.

# Código extraído de: Gráfico_barras_TICS.R

# AJUSTE: layout="l-page" usa TODO el ancho de la pantalla. 
# fig.height=9 necesario porque hay muchas comunidades en el eje X.

# Corrección nombres
uso_tic_total_corregido <- uso_tic_total %>%
  mutate(
    Comunidad = case_when(
      Comunidad == "Andalucía" ~ "Andalucía",
      Comunidad == "Aragón" ~ "Aragón",
      Comunidad == "Asturias, Principado de" ~ "Asturias",
      Comunidad == "Balears, Illes" ~ "Baleares",
      Comunidad == "Canarias" ~ "Canarias",
      Comunidad == "Cantabria" ~ "Cantabria",
      Comunidad == "Castilla y León" ~ "Castilla y León",
      Comunidad == "Castilla - La Mancha" ~ "Castilla - La Mancha",
      Comunidad == "Comunitat Valenciana" ~ "Comunidad Valenciana",
      Comunidad == "Extremadura" ~ "Extremadura",
      Comunidad == "Galicia" ~ "Galicia",
      Comunidad == "Madrid, Comunidad de" ~ "Madrid",
      Comunidad == "Murcia, Región de" ~ "Murcia",
      Comunidad == "Navarra, Comunidad Foral de" ~ "Navarra",
      Comunidad == "País Vasco" ~ "País Vasco",
      Comunidad == "Rioja, La" ~ "La Rioja",
      Comunidad == "Ceuta" ~ "Ceuta",
      Comunidad == "Melilla" ~ "Melilla",
      TRUE ~ Comunidad
    )
  )

# Pivotaje
uso_tic_total_pivotada <- uso_tic_total_corregido %>% 
  pivot_longer(
    cols= -Comunidad,
    names_to = "Grupo_Edad",
    values_to = "Frecuencia_Total"
  )

orden_grupos <- c("Frecuencia_Total_Niños", "Frecuencia_Total_Adultos", "Frecuencia_Total_Mayores")
names_grupos <- c("Niños (10-15)", "Adultos (16-74)", "Mayores (75+)")

uso_tic_ordenada <- uso_tic_total_pivotada %>% 
  mutate(Grupo_Edad = factor(Grupo_Edad, levels = orden_grupos, labels = names_grupos))

# Gráfico
ggplot(uso_tic_ordenada, aes(x=Comunidad, y=Frecuencia_Total, fill=Grupo_Edad))+
  geom_bar(stat = "identity", position = "dodge")+
  labs(
    title= "Perfil de Uso Frecuente de las TIC por Edad y Comunidad",
    y= "Porcentaje de Uso Promedio (%)",
    x= "",
    fill = "Grupo de Edad")+
  scale_fill_brewer(palette = "Blues") +
  theme_classic()+
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1, size=10),
    legend.position = "top"
  )

4. Relación TICs con Depresión por Comunidades

¿Cómo se distribuye geográficamente el uso de tecnología? Utilizamos un mapa interactivo para explorar los datos territoriales.

# Código extraído de: Mapa_España_TICS.R

# AJUSTE: layout="l-page" es CRÍTICO aquí para que el mapa se vea grande y bonito.

mapa_españa_ccaa <- esp_get_ccaa(moveCAN = TRUE)

# Corrección para mapa
uso_tic_total_corregido_mapa <- uso_tic_total %>%
  mutate(
    Comunidad = case_when(
      Comunidad == "Balears, Illes" ~ "Baleares",
      Comunidad == "Castilla - La Mancha" ~ "Castilla-La Mancha",
      Comunidad == "Comunitat Valenciana" ~ "Comunidad Valenciana",
      Comunidad == "Madrid, Comunidad de" ~ "Madrid",
      Comunidad == "Murcia, Región de" ~ "Murcia",
      Comunidad == "Navarra, Comunidad Foral de" ~ "Navarra",
      Comunidad == "Rioja, La" ~ "La Rioja",
      TRUE ~ Comunidad
    )
  )

mapa_con_datos <- mapa_españa_ccaa %>%
  left_join(uso_tic_total_corregido_mapa, by = c("ccaa.shortname.es" = "Comunidad"))

# Tooltip arreglado para que se vea bien
mapa_con_datos <- mapa_con_datos %>%
  mutate(
    tooltip_data = paste0(
      '<b>', ccaa.shortname.es, "</b><br>", 
      "Uso Adultos: ", round(Frecuencia_Total_Adultos, 1), "%<br>",
      "Uso Niños: ", round(Frecuencia_Total_Niños, 1), "%<br>",
      "Uso Mayores: ", round(Frecuencia_Total_Mayores, 1), "%"
    )
  )

colores_ccaa <- c(
  "Andalucía" = "#C0C0C0", "Aragón" = "#FFD700", "Asturias" = "#0000FF",            
  "Baleares" = "#800080", "Canarias" = "#FFA500", "Cantabria" = "#008000",           
  "Castilla y León" = "#B0C4DE", "Castilla-La Mancha" = "#FF0000",
  "Comunidad Valenciana" = "#ADD8E6", "Extremadura" = "#8B4513",         
  "Galicia" = "#40E0D0", "Madrid" = "#FFFF00", "Murcia" = "#FFC0CB",              
  "Navarra" = "#A52A2A", "País Vasco" = "#00FF00", "La Rioja" = "#DA70D6",            
  "Ceuta" = "#4682B4", "Melilla" = "#5F9EA0", "Cataluña" = "#FFDAB9"
)

mapa_estatico_gg <- ggplot(data = mapa_con_datos) +
  geom_sf(
    aes(fill = ccaa.shortname.es, text = tooltip_data),
    color = "white", size = 0.2 
  ) +
  # Quitamos geom_sf_text porque a veces satura el mapa interactivo
  scale_fill_manual(values = colores_ccaa) +
  theme_void() +
  theme(legend.position = "none")

mapa_interactivo_gg <- ggplotly(mapa_estatico_gg, tooltip = "text")

mapa_interactivo_final <- mapa_interactivo_gg %>%
  style(hoveron = "fills", traces = 1) %>% 
  layout(
    hoverlabel = list(bgcolor = "white", bordercolor = "black", font = list(color = "black"))
  )

mapa_interactivo_final

5. Relación TICs con Depresión por Nivel de Estudios

Analizamos si la educación actúa como factor protector, utilizando un gráfico de doble eje.

# Código extraído de: Grafico_nivel_estudios.R

# AJUSTE: fig.height=6 y l-body-outset para que las líneas se vean claras.

if(exists("tabla_nivel_estudios_final")){
  
  max_tics <- max(tabla_nivel_estudios_final$Porcentaje_TICS, na.rm = TRUE)
  max_depresion <- max(tabla_nivel_estudios_final$Porcentaje_Depresion, na.rm = TRUE)
  factor_escala <- max_tics / max_depresion

  ggplot(tabla_nivel_estudios_final, 
         aes(x = as.numeric(factor(Nivel_de_estudios, 
                                   levels = c("Básico e inferior", "Intermedio", "Superior"))), 
             group = 1)) +
    
    geom_line(aes(y = Porcentaje_TICS, color = "Uso de TICs"), linewidth = 1.2) +
    geom_point(aes(y = Porcentaje_TICS, color = "Uso de TICs"), size = 4) +
    geom_text(aes(y = Porcentaje_TICS, label = round(Porcentaje_TICS, 1)), vjust = -1.5, fontface="bold") +
    
    geom_line(aes(y = Porcentaje_Depresion * factor_escala, color = "Depresión"), linewidth = 1.2) +
    geom_point(aes(y = Porcentaje_Depresion * factor_escala, color = "Depresión"), size = 4) +
    geom_text(aes(y = Porcentaje_Depresion * factor_escala, label = round(Porcentaje_Depresion, 1)), vjust = 2, fontface="bold") +
    
    scale_y_continuous(
      name = "Uso de TICs (%)",
      sec.axis = sec_axis(~ . / factor_escala, name = "Depresión (%)")
    ) +
    
    scale_x_continuous(
      breaks = 1:3,
      labels = c("Básico e inferior", "Intermedio", "Superior"),
      name = "Nivel de Estudios"
    ) +
    
    scale_color_manual(values = c("Uso de TICs" = "#1f77b4", "Depresión" = "#d62728")) +
    
    labs(
      title = "Nivel de Estudios: Factor Protector",
      subtitle = "Relación inversa entre adopción tecnológica y depresión",
      color = ""
    ) +
    theme_classic() +
    theme(legend.position = "bottom")
}

6. Relación TICs con Empleabilidad

Finalmente, mostramos la “paradoja” del uso de tecnología y la empleabilidad.

df_contexto <- mis_datos_salud_mental$depresion_actividad_economica %>%
  
  # 1. Renombrar usando nombres reales (Más seguro que el índice 1, 2...)
  rename(
    Actividad = `Actividad.económica`,
    Tipo_Depresion = `Prevalencia.depresión`,
    Porcentaje = Total
  ) %>%
  
  # 2. Filtros estándar
  filter(
    Sexo == "Ambos sexos",
    Tipo_Depresion == "Cuadro depresivo mayor",
    Actividad != "TOTAL"
  ) %>%
  
  mutate(
    # 3. ¡CORRECCIÓN CLAVE! Usamos parse_number (de tu práctica)
    Tasa_Depresion = parse_number(Porcentaje, locale = locale(decimal_mark = ",")),
    
    # 4. Usamos grepl() (R base) o igualdad exacta para homologar
    Clave_Union = case_when(
      Actividad == "Parados" ~ "En desempleo",
      Actividad == "Jubilado/a o prejubilado/a" ~ "Jubilado/Pensionista",
      Actividad == "Labores del hogar" ~ "Labores del hogar",
      Actividad == "Incapacitado/a para trabajar" ~ "Incapacitado",
      TRUE ~ "Otros"
    ),
    
    # 5. Lógica visual simple
    Color_Barra = ifelse(Clave_Union == "En desempleo", "#C0392B", "#95A5A6")
  ) %>%
  select(Clave_Union, Actividad, Tasa_Depresion, Color_Barra)

# ==============================================================================
# 2. DATOS TIC (Uso de Internet)
# ==============================================================================

lista_frecuencias <- c(
  "Han usado Internet diariamente (al menos 5 días a la semana)",
  "Han utilizado internet varias veces al día"
)

df_tic_preparado <- mis_datos_tic$uso_internet_socioeconomico %>%
  
  # 1. Renombrar usando los nombres que genera make.names (sin tildes)
  rename(
    Grupo = Clase.de.población, 
    Características = Características.socioeconómicas, 
    Frecuencia = Frecuencia.de.uso, 
    Total_TIC = Total
  ) %>%
  
  # 2. Filtros (usando grepl para buscar "diariamente")
  filter(
    Grupo == "Total de personas (16 a 74 años)",
    Frecuencia %in% lista_frecuencias
    
  ) %>%
  
  mutate(
    # 3. Usamos parse_number otra vez
    Tasa_Internet = parse_number(Total_TIC, locale = locale(decimal_mark = ",")),
    
    # 4. Homologación con grepl (equivalente a str_detect)
    Clave_Union = case_when(
      Características == "Situación laboral: Activos ocupados" ~ "Trabajando",
      Características == "Situación laboral: Activos parados" ~ "En desempleo",
      Características == "Situación laboral: Inactivos: Estudiantes" ~ "Estudiando",
      Características == "Situación laboral: Inactivos: Pensionistas" ~ "Jubilado/Pensionista",
      Características == "Situación laboral: Inactivos: Labores del hogar" ~ "Labores del hogar",
      TRUE ~ "Otros"
    )
  ) %>%
  
  
  group_by(Clave_Union) %>%
  summarise(Tasa_Internet = mean(Tasa_Internet, na.rm = TRUE))

# ==============================================================================
# 3. UNIÓN FINAL
# ==============================================================================
df_final<- left_join(df_contexto, df_tic_preparado, by = "Clave_Union") %>%
  filter(!is.na(Tasa_Internet)) %>% 
  select(Clave_Union, Tasa_Depresion, Tasa_Internet, Color_Barra)

g1 <- ggplot(df_contexto, aes(x = reorder(Actividad, -Tasa_Depresion), y = Tasa_Depresion)) +
  # Barras con color condicional (Rojo para desempleo)
  geom_col(aes(fill = Color_Barra), width = 0.6, alpha = 0.9) + 
  
  # Etiquetas numéricas sobre las barras
  geom_text(aes(label = paste0(Tasa_Depresion, "%")), 
            vjust = -0.5, fontface = "bold", color = "#2C3E50", size = 3.5) +
  
  scale_fill_identity() +
  # Truco técnico: str_wrap parte los textos largos del eje X
  scale_x_discrete(labels = function(x) stringr::str_wrap(x, width = 10)) + 
  scale_y_continuous(limits = c(0, max(df_contexto$Tasa_Depresion) + 1.5)) +
  
  # Títulos con formato HTML (ggtext)
  labs(
    title = "<span style='font-size:14pt'>1. El Contexto</span>",
    subtitle = "El <span style='color:#C0392B'><b>Desempleo</b></span> es el factor crítico en la salud mental base.",
    x = "", y = ""
  ) +
  
  theme_fivethirtyeight() +
  theme(
    plot.title = element_markdown(face = "bold"),
    plot.subtitle = element_markdown(size = 10),
    axis.text.x = element_text(size = 8.5, face = "bold", lineheight = 0.9),
    axis.text.y = element_blank(),
    panel.grid.major = element_blank(),
    plot.background = element_rect(fill = "white", color = NA),
    panel.background = element_rect(fill = "white", color = NA)
  )

# ==============================================================================
# 5. VISUALIZACIÓN: GRÁFICO 2 (EL GIRO)
# ==============================================================================
g2 <- ggplot(df_final_narrativa, aes(x = Tasa_Internet, y = Tasa_Depresion)) +
  # Línea de tendencia
  geom_smooth(method = "lm", se = FALSE, color = "aquamarine1", linetype = "solid", size = 1) +
  
  # Puntos principales con borde blanco (estilo 'pop')
  geom_point(aes(fill = Clave_Union), size = 6, shape = 21, color = "white", stroke = 1.5) +
  
  # ggforce: Elipse para resaltar la paradoja (Estudiantes vs Parados)
  geom_mark_ellipse(aes(filter = Clave_Union %in% c("En desempleo", "Estudiando"),
                        label = Clave_Union,
                        description = "Perfiles opuestos"),
                    label.fontsize = 8, 
                    label.buffer = unit(5, "mm"),
                    con.cap = 0,
                    color = "grey50") +
  
  # ggrepel: Etiquetas para el resto de puntos sin solapamiento
  geom_text_repel(aes(label = Clave_Union), 
                  data = subset(df_final_narrativa, !Clave_Union %in% c("En desempleo", "Estudiando")),
                  size = 3.5, color = "grey40", point.padding = 0.5) +
  
  scale_fill_tableau() +
  labs(
    title = "<span style='font-size:14pt'>2. El Giro (TICs)</span>",
    subtitle = "Alta tecnología no garantiza salud mental: comparar <b style='color:#F28E2B'>Estudiantes</b> vs <b style='color:#E15759'>Parados</b>.",
    x = "Uso Diario de Internet (%)", 
    y = "Depresión Mayor (%)",
    caption = "Fuente: Elaboración propia con datos INE"
  ) +
  
  theme_minimal(base_size = 12) +
  theme(
    plot.title = element_markdown(face = "bold"),
    plot.subtitle = element_markdown(size = 10),
    legend.position = "none",
    axis.title = element_text(size = 9, face = "bold", color = "grey40"),
    panel.grid.minor = element_blank(),
    panel.grid.major = element_line(color = "grey95")
  )

# ==============================================================================
# 6. COMPOSICIÓN FINAL (PATCHWORK)
# ==============================================================================
#Ponemos un gráfico encima del otro con g1 / g2 porque sino se visualiza mal 
layout_final <- g1 / g2 + 
  plot_annotation(
    title = 'IMPACTO DEL TRABAJO Y LA BRECHA DIGITAL EN LA SALUD MENTAL',
    subtitle = 'Análisis cruzado de Encuesta Europea de Salud y Encuesta TIC',
    theme = theme(plot.title = element_text(size = 18, face = "bold", hjust = 0.5))
  )

# Mostrar resultado final
print(layout_final)